/*
 * ________________________________________________________________________________________________________
 * Copyright (c) 2016-2016 InvenSense Inc. All rights reserved.
 *
 * This software, related documentation and any modifications thereto (collectively �Software�) is subject
 * to InvenSense and its licensors' intellectual property rights under U.S. and international copyright
 * and other intellectual property rights laws.
 *
 * InvenSense and its licensors retain all intellectual property and proprietary rights in and to the Software
 * and any use, reproduction, disclosure or distribution of the Software without an express license agreement
 * from InvenSense is strictly prohibited.
 *
 * EXCEPT AS OTHERWISE PROVIDED IN A LICENSE AGREEMENT BETWEEN THE PARTIES, THE SOFTWARE IS
 * PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 * EXCEPT AS OTHERWISE PROVIDED IN A LICENSE AGREEMENT BETWEEN THE PARTIES, IN NO EVENT SHALL
 * INVENSENSE BE LIABLE FOR ANY DIRECT, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY
 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 * OF THE SOFTWARE.
 * ________________________________________________________________________________________________________
 */
#ifndef _SYSTEM_INTERFACE_H_
#define _SYSTEM_INTERFACE_H_

#ifdef __cplusplus
extern "C" {
#endif
#include "Invn/Drivers/Icm426xx/Icm426xxTransport.h"
#include "Invn/Drivers/Icm426xx/Icm426xxDriver_HL.h"
#include "Invn/EmbUtils/RingBuffer.h"
#include "fsl_lpspi.h"

#define LPSPI_IMU_MASTER_BASEADDR  (LPSPI4)
#define LPSPI_IMU_PCS_FOR_INIT     (kLPSPI_Pcs0)
#define LPSPI_IMU_PCS_FOR_TRANSFER (kLPSPI_MasterPcs0)

#ifndef TO_MASK
#define TO_MASK(a) (1U << (unsigned)(a))
#endif

/** @brief define all supported board revisions types*/
#define SM_REVB_DB 0
#define SM_REVB_OB 1
#define SM_REVG    2

#define USE_CLK_IN 0
#define IS_LOW_NOISE_MODE 1

/*
 * Accelerometer and gyroscope frequencies.
 * Recommended value: ICM426XX_GYRO_CONFIG0_ODR_1_KHZ and ICM426XX_ACCEL_CONFIG0_ODR_1_KHZ (1000 Hz)
 * Possible values (same for accel, replace "GYRO" with "ACCEL"): 
 * - ICM426XX_GYRO_CONFIG0_ODR_1_KHZ  (1000 Hz)
 * - ICM426XX_GYRO_CONFIG0_ODR_500_HZ (500 Hz)
 * - ICM426XX_GYRO_CONFIG0_ODR_200_HZ (200 Hz)
 * - ICM426XX_GYRO_CONFIG0_ODR_100_HZ (100 Hz)
 * - ICM426XX_GYRO_CONFIG0_ODR_50_HZ (50 Hz)
 */
#define GYRO_FREQ  ICM426XX_GYRO_CONFIG0_ODR_1_KHZ
#define ACCEL_FREQ ICM426XX_ACCEL_CONFIG0_ODR_1_KHZ

/*
 * Set this define to 0 to disable mag support
 * Recommended value: 1
 */
#define USE_MAG 0

/*
 * Magnetometer output data rate in us
 * Only supported value: 10000 us (100 Hz)
 * Possible values:
 * - 5000  (200 Hz)
 * - 10000 (100 Hz)
 * - 20000 (50 Hz)
 * Note: Not use if `USE_MAG` is set to 0
 */
#define MAG_ODR_US 10000

/* 
 * Typical time for the compass to generate a data
 */
#define MAG_DATA_RDY_DELAY_US 4500 /* Typical time for the compass to generate a data */

/*
 * Select Fifo resolution Mode (default is low resolution mode)
 * Low resolution mode : 16 bits data format
 * High resolution mode : 20 bits data format
 * Warning: Enabling High Res mode will force FSR to 16g and 2000dps
 */
#define IS_HIGH_RES_MODE 0

extern int irq_from_device;


typedef struct {	
		uint16_t 	read, write;	
		uint64_t	 	buffer[64]; 	
	}Buffer_t;
extern Buffer_t timestamp_buffer;

/** @brief I3C context definition
 */
typedef struct {
	int (*idd_io_hal_i3c_detect_soft_reset)(uint8_t, const uint8_t *);
} idd_io_hal_i3c_context_t;

int  inv_io_hal_configure(struct inv_icm426xx_serif *serif);
int  inv_io_hal_read_reg(struct inv_icm426xx_serif *serif, uint8_t reg, uint8_t *rbuffer,
                         uint32_t rlen);
int  inv_io_hal_write_reg(struct inv_icm426xx_serif *serif, uint8_t reg, const uint8_t *wbuffer,
                          uint32_t wlen);

extern uint64_t inv_icm426xx_get_time_us(void);


extern void inv_icm426xx_sleep_us(uint32_t us);

extern void inv_disable_irq(void);
extern void inv_enable_irq(void);
/*


int akm_io_hal_init(void *serif);
int akm_io_hal_read_reg(void *serif, uint8_t reg, uint8_t *rbuffer, uint32_t rlen);
int akm_io_hal_write_reg(void *serif, uint8_t reg, const uint8_t *wbuffer, uint32_t wlen);*/
#ifdef __cplusplus
}
#endif
#endif /* !_SYSTEM_INTERFACE_H_ */
